The size of large databases and other software applications may be a limiting factor in the usefulness of such applications, particularly when queries, calculations, operations, and other tasks are themselves long and complex. For example, a user may wish to issue a complex query to obtain results from a relational database having many thousands or millions of records, in which case a response time to provide corresponding query results may be unacceptably long. Moreover, such scenarios may lend themselves to inefficient use of available computational resources, e.g., by allowing over-consumption of resources by one user with respect to other current users.
Availability of multi-core (e.g., multi-CPU) computing systems have facilitated the development of parallel execution techniques as a way to mitigate such concerns. For example, by using two available cores, multiple tasks (and/or multiple portions thereof) may be computed in parallel with one another. Consequently, for example, two equivalent tasks may be executed in less than double the time it would take to execute one of the tasks.
Implementation of such parallel tasks, however, is difficult to accomplish in an efficient or optimal manner. For example, there may be costs associated with splitting/assigning multiple tasks to the multiple cores, as well as costs associated with re-joining or merging the results of the tasks. Depending, e.g., on the nature of the tasks in question and the extent of the parallelization, such costs may limit, and may ultimately dominate or overwhelm, the benefits of the parallelization.
Moreover, complexity and unpredictability of a runtime environment of one or more running tasks may exacerbate the difficulties of multi-core parallel task processing. For example, even if an acceptable plan for parallelization is formulated prior to runtime of a task(s) in question, it may occur that runtime events may reduce the efficacy or desirability of the planned schedule (for example, when processing cores have substantially greater or lesser runtime availability than anticipated).
Additionally, these and other types of computational overheads may vary according to the types of tasks being computed. For example, some tasks may be easier to divide and/or combine than other tasks. Moreover, tasks being computed may change over time, e.g., as current tasks are completed, and new tasks are loaded. Therefore, and depending on how the various tasks are configured for parallel computation thereof, the varying tasks may again suffer from associated computational overheads to varying extents.
Thus, when creating tasks and/or configuring created tasks for a parallel computation thereof, it may be difficult to predict and/or account for an impact of various types of associated computational overhead. Consequently, a full benefit of parallel computing may be difficult to achieve.